<?php
//只读属性

//1、只读属性只能初始化一次，且只能从声明他的作用域内初始化，初始化后，不能二次更改
//class Cat
//{
//    public function __construct(public readonly string $name)
//    {
//    }
//}
//
//$c = new Cat('狸花');
//$c->name = '胖橘';    //报错，二次赋值
//var_dump($c->name);


//2、赋值后也无法通过内部方法重新赋值
//class Cat
//{
//   const NAME = '123';
//
//    public readonly string $name;
//    public function setName(string $name):void
//    {
//        $this->name= $name;
//    }
//}
//
//$c = new Cat();
////$c->name = '狸花';     //不允许从外部赋值
//$c->setName('胖橘');
////$c->setName('狸花');    //报错，二次赋值
//var_dump($c->name);


//3、禁止给只读属性指定默认值，因为具有默认值的只读属性等同于常量
//只读属性也不能是静态属性
//4、只读属性不能被unset
//class Cat{
//    //public readonly string $name = '三花';  //禁止指定默认值；
//    //static readonly string $name;            //只读属性不能是静态属性
//    public readonly string $name;  //禁止指定默认值；
//    public function setName(string $name):void
//    {
//        $this->name= $name;
//    }
//}
//$c = new Cat();
//unset($c->name);            //不行
////$c->setName('狸花') ;
////unset($c->name);          //不行
////var_dump($c->name);


//6，制度对象存储的是对象或数组时，对象和数组本身是可以在内部修改的
//数组
//class Cat
//{
//    public readonly array $obj;
//
//    public function setObj(array $obj): void
//    {
//        $this->obj = $obj;
//    }
//}
//
//class Run
//{
//    public $speed = [
//        'a'=>60,
//        'b'=>70,
//        'c'=>80,
//    ];
//}
//
//$c = new Cat();
//$obj = new Run();
//$obj->speed ['c']= 100;
//$c->setObj($obj->speed);
//var_dump($c->obj);

//对象
class Cat{
    public readonly object $obj;
    public function setObj(object $obj): void{
        $this->obj = $obj;
    }
}

class Run{
    public $speed = 70;
}

$c = new Cat();
$obj = new Run();
$obj->speed = 80;
$c->setObj($obj);
var_dump($c->obj);